package document_request

import (
	"private-go-sdk/http"
	"private-go-sdk/model/common"
	"encoding/json"
)

type DocumentCreatebytemplateRequest struct {
	// <ext>core:true</ext> 【文件模板id】文件模板id
	TemplateId string `json:"templateId"`
	// <ext>core:true</ext> 【签署文档名称】签署文档名称 【作用】 用于传入上传的签署文档的名称 【传参】 不传值默认为：模板名称。
	Title string `json:"title,omitempty"`
	// <ext>core:true</ext> 【模板参数值】模板参数值 【传参】 1、json格式字符串 2、键值对的key为参数的唯一标识，支持传入参数的name或key；value为参数值 3、当使用HTML模板时，value的json字符串的value值注意事项如下： 1）单行文本 传入文本内容，例如{\"单行文本\":\"这里是一段文本描述……\"}。 2）日期 格式为：yyyy-MM-dd，如：{\"日期\":\"2019-06-04\"}。 3）身份证号 仅支持15或18位的数字或字母，如：{\"身份证\":\"123456789123456789；\"}； 4）单选 仅支持传入单选的选项，如：{\"性别\":\"女\"}; 若传入其他选项： （1）需要填写补充内容，则传入格式为：其他选项名称{{补充内容}} （2）不需要填写补充内容，则传入：其他选项名称 5）多选 仅支持传入多选的选项，多个value用逗号隔开，如：{\"爱好\":\"乒乓球,篮球\"}；若传入其他选项： （1）需要填写补充内容，则传入格式为：其他选项名称{{补充内容}} （2）不需要填写补充内容，则传入：其他选项名称 6）表格 （1）参数名称即表格的Key值，参数值是一维数组且需转成字符串类型，数组的每项对应表格的每行，而每行中每一列的名称和值即对应列的key值和实际填写的值，转成字符串的一维数组示例：[{\\\"column1\\\":\\\"1\\\",\\\"column2\\\":\\\"2\\\",\\\"column3\\\":\\\"3\\\",\\\"column4\\\":\\\"4\\\"},{\\\"column1\\\":\\\"5\\\",\\\"column2\\\":\\\"6\\\",\\\"column3\\\":\\\"7\\\",\\\"column4\\\":\\\"8\\\"}]表示一个2行4列的表格。 （2）如若需要合并单元格，传参示例如下: [{\\\"column1\\\":\\\"1\\\",\\\"column2\\\":\\\"2\\\",\\\"column3\\\":\\\"3\\\",\\\"column4\\\":\\\"4\\\"},{\\\"column1\\\":\\\"5\\\",\\\"column2\\\":\\\"6\\\",\\\"column3\\\":\\\"7\\\",\\\"column4\\\":\\\"#.3\\\"}], #.1表示向左合并单元格，#.2表示向上合并单元格。#.3表示向左上合并单元格。 （3）表格的行数在传参的时候根据实际传入的会动态新增，但表格列不可动态新增，只能设置表格固定列为准 7）图片 需传入json字符串，包含value(base64图片包含base64前缀，必填)、fileName(图片名称，必填)两个参数，如：{\"fileName\":\"1.png\",\"value\":\"...\"}。 8）富文本 富文本形式的字符串，标签中的双引号需要用\\进行转义，如{\"富文本\": \"红色文字\"}。 9）邮箱 邮箱形式的字符串，如：{\"邮箱\":\"umklch01@163.com\"}。 10）级联 级联参数的字符串，如：{\"参数改名称\":\"[\\\"选项1\\\",\\\"选项A\\\",\\\"选项a\\\"]\"}。
	Params string `json:"params,omitempty"`
	// <ext>inner-type:Json<WaterMarkContent[]></ext> 【文件水印】文件水印 【作用】 1、可在签署文档上添加水印，允许传入多组水印 2、若新增的文件已添加数字签名，因添加文件水印会篡改文件导致数字签名失效，故文件水印不会生效
	WaterMarks string `json:"waterMarks,omitempty"`
	// <ext>inner-type:Json<StampWaterMarkContent[]></ext> 【印章水印】印章水印 【作用】 1、可在印章外观上添加水印，防止签署文件上的印章被抠章后二次使用，允许传入多组水印 2、印章水印将会与该签署文档绑定，后续在这份文档上进行签章时，发起方下的所有内部签署方使用的印章外观会自动添加水印
	StampWaterMarks string `json:"stampWaterMarks,omitempty"`
	// <ext>inner-type:Json<DocumentFormDto></ext> 【表单域】表单域 【作用】 1、进行过数字签名后的PDF文档，任何对内容的修改都会导致签名失效，从而保护数据不被篡改。但是在内部文件审批流程中，有时需要对已签名或盖章的文件添加额外的签署或审批意见。此时可利用PDF的表单域功能，在不破坏原有签名的情况下，对文件添加内容； 2、表单域是PDF文档中允许填写文本或进行选择操作的特定区域，创建文档时添加的表单域，即使文件已经添加了数字签名，用户仍然可以在表单域中添加或修改内容 【风险提示】 1、需注意，表单域不适用于签署合同等文件，接收方签署完成后，发起方对于合同的任何修改都可能会违背接收方的真实意愿，对合同的法律效力产生影响。（例如，劳动合同签署场景中，员工签字完成后，企业如果使用表单域修改“社保缴纳地”等信息，未经过员工的确认，违背了员工的真实意愿，影响了合同的法律效力，容易产生纠纷。） 2、因此，在使用表单域功能之前，请确保使用的场景符合法律法规要求，不会违背签署人的真实意愿，再开启并使用此功能。
	Form string `json:"form,omitempty"`
	// 【对文档加密限制文档编辑】对文档加密限制文档编辑 【作用】 1. 可选择对文档添加编辑口令进行加密，该文档进行签署后，可防止用户进行抠章或编辑操作，下载到本地也不能进行编辑或导出为Word 2. 仅在Office、WPS、福昕、adobe系列软件中才可限制不允许编辑，其余软件因产品自身功能规则不同，可能无法限制编辑 3. 已有数字签名的文件上传时不支持加密（加密将影响签名有效性） 4. 若后续需要获取文档的编辑口令，可调用<docs>/contract/getDocumentPassword</docs> 【传参】 取值范围：true（加密），false（不加密）；不传值默认为：false（不加密）。
	IsPassword *bool `json:"isPassword,omitempty"`
	// 【预览页展示下载按钮】预览页展示下载按钮 【传参】 取值范围：true（展示），false（不展示）；不传值默认为：false（不展示）。
	ViewDownload string `json:"viewDownload,omitempty"`
	// 【链接有效期】链接有效期 【作用】 1、用于设置获取到的链接在多长时间后过期 2、参数不传值时，链接有效期取电子签章管理后台设置的“接口页面默认有效期 3、参数传入时长超过电子签章管理后台设置的“接口页面最大有效期天数”时，将以后台设置的有效期为准 【传参】 最小值：1。单位：秒。
	ExpireTime *int64 `json:"expireTime,omitempty"`
	FormObject *common.DocumentFormDto `json:"formObject,omitempty"`
	StampWaterMarksObject []*common.DocumentStampWaterMarkContent `json:"stampWaterMarksObject,omitempty"`
	WaterMarksObject []*common.DocumentWaterMarkContent `json:"waterMarksObject,omitempty"`
}
func (obj DocumentCreatebytemplateRequest) GetUrl() string {
    return "/document/createbytemplate"
}

func (obj DocumentCreatebytemplateRequest) GetHttpParameter() *http.HttpParameter {
    parameter := http.NewPostHttpParameter()
    parameter.AddParam("templateId", obj.TemplateId)
    parameter.AddParam("title", obj.Title)
    parameter.AddParam("params", obj.Params)
    parameter.AddParam("isPassword", obj.IsPassword)
    parameter.AddParam("viewDownload", obj.ViewDownload)
    parameter.AddParam("expireTime", obj.ExpireTime)
    if obj.FormObject != nil {
       jsonBytes, _ := json.Marshal(obj.FormObject)
       parameter.AddParam("form", string(jsonBytes))
   } else {
       parameter.AddParam("form", obj.Form)
   }
    if obj.StampWaterMarksObject != nil {
       jsonBytes, _ := json.Marshal(obj.StampWaterMarksObject)
       parameter.AddParam("stampWaterMarks", string(jsonBytes))
   } else {
       parameter.AddParam("stampWaterMarks", obj.StampWaterMarks)
   }
    if obj.WaterMarksObject != nil {
       jsonBytes, _ := json.Marshal(obj.WaterMarksObject)
       parameter.AddParam("waterMarks", string(jsonBytes))
   } else {
       parameter.AddParam("waterMarks", obj.WaterMarks)
   }
    return parameter
}
